﻿using SistemaAdministracion.Models.BaseClass;
using SistemaAdministracion.Models.PatternBase;
using SistemaAdministracion.Models.ViewModels.Personas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace SistemaAdministracion.Controllers
{
    public class PersonaController : Controller
    {
        //inicializamos el patron 
        IDbContext _context;
        UnitOfWork _UoW;
        IRepository<Persona> _repPersona;
        IRepository<RepLegal> _repRepreLegal;
        IRepository<Empresa> _repEmpresa;

        public PersonaController()
        {
            _context = new DbContextAdapter(ContextBase.ContextBaseInstance);
            _UoW = new UnitOfWork(_context);
            _repPersona = new BaseRepository<Persona>(_context);
            _repEmpresa = new BaseRepository<Empresa>(_context);
            _repRepreLegal = new BaseRepository<RepLegal>(_context);
        }

        // GET: /Persona/
        public ActionResult BandejaPersonas()
        {
            List<Persona> personas = _repPersona.GetAll().ToList();
            return View(personas);
        }

        public ActionResult Nuevo()
        {
            List<Empresa> empresas = _repEmpresa.GetAll().ToList();
            ViewBag.empresas = empresas;
            return View();
        }

        [HttpPost]
        public ActionResult Nuevo(NuevaPersonaViewModel ModelPersona)
        {
            if (ModelState.IsValid)
            {
                //if (ModelPersona.EmpCheck != null || ModelPersona.EmpCheck.Count != 0)
                //{
                //    Persona NewPers = new Persona()
                //    {
                //        RUN = ModelPersona.NuevaPersModel.RUN,
                //        DV = ModelPersona.NuevaPersModel.DV,
                //        Nombres = ModelPersona.NuevaPersModel.Nombres,
                //        ApPaterno = ModelPersona.NuevaPersModel.ApPaterno,
                //        ApMaterno = ModelPersona.NuevaPersModel.ApMaterno,
                //        Sexo = ModelPersona.NuevaPersModel.Sexo,
                //        Vigencia = ModelPersona.NuevaPersModel.Vigencia
                //    };
                //    _repPersona.Add(NewPers);
                //    _UoW.Commint();

                //    var pers = _repPersona.SingleOrDefault(per => per.RUN == NewPers.RUN);
                //    foreach (var item in ModelPersona.EmpCheck)
                //    {
                //        if (item.Checked)
                //        {
                //            var empres = _repEmpresa.SingleOrDefault(em => em.RUT == item.RutEmpresa);
                //            RepLegal RepLe = new RepLegal { IdPersona = pers.IdPersona, IdEmpresa = empres.IdEmpresa, Persona = pers, Empresa = empres };
                //            _repRepreLegal.Add(RepLe);
                //            _UoW.Commint();
                //        }
                //    }
                //}
                Persona NewPers = new Persona()
                {
                    RUN = ModelPersona.RUN,
                    DV = GenerarDV(ModelPersona.RUN),
                    Nombres = ModelPersona.Nombres,
                    ApPaterno = ModelPersona.ApPaterno,
                    ApMaterno = ModelPersona.ApMaterno,
                    Sexo = ModelPersona.Sexo,
                    Vigencia = ModelPersona.Vigencia
                };
                _repPersona.Add(NewPers);
                _UoW.Commint();

            }
            return View();
        }

        public static char GenerarDV(int num)
        {
            return "0K987654321"[
            Enumerable.Range(0, (int)Math.Floor(Math.Log10(num)) + 2)
            .Select(i =>
            ((i % 6) + 2) *
            ((num / (int)Math.Pow(10, i)) % 10))
            .Sum() % 11];
        }

        public ActionResult Editar(int rut)
        {
            var persona = _repPersona.SingleOrDefault(r => r.RUN == rut);
            var edit = new EditViewModel
            {
                Nombres = persona.Nombres,
                ApPaterno = persona.ApPaterno,
                ApMaterno = persona.ApMaterno,
                FecNacimientos = persona.FecNacimientos
            };
            return View(edit);
        }

        [HttpPost]
        public ActionResult Editar(EditViewModel EditModelPersona)
        {
            if (ModelState.IsValid)
            {
                var per = _repPersona.SingleOrDefault(e => e.RUN == EditModelPersona.RUN);
                if (per != null)
                {
                    per.Nombres = EditModelPersona.Nombres;
                    per.ApPaterno = EditModelPersona.ApPaterno;
                    per.ApMaterno = EditModelPersona.ApMaterno;
                    per.FecNacimientos = EditModelPersona.FecNacimientos;

                    _UoW.Commint();
                }
            }
            return View();
        }

        public ActionResult Comprobar(int rut)
        {
            var perso = _repPersona.SingleOrDefault(p => p.RUN == rut);
            if (perso != null)
                return View(perso);
            else
                return View();
        }

        [HttpPost]
        public ActionResult Eliminar(int rut, bool resp)
        {
            if (rut != 0)
            {
                if (resp)
                {
                    var pers = _repPersona.SingleOrDefault(p => p.RUN == rut);
                    pers.Vigencia = 0;
                    _UoW.Commint();
                }
                else
                {
                    return RedirectToAction("", "");
                }
            }
            return View();
        }

    }
}